#ifndef GAME_H
#define GAME_H

#include <core/config.h>
#include <list>
#include <game/tobject.h>
#include <game/twall.h>
#include <game/ttank.h>
#include <game/tbullet.h>
#include <game/tobjectinteractor.h>

typedef list<TObject*>::iterator TObjectIterator;

class Game{
public:
    /// инициализация игры, только после вызова этой функции можно использовать этот синглтон
    static void initGame();

    /// get the singleton object
    static Game* Instance();

    /// что происходит со всеми объектами за тик
    void tick(QPainter& painter);

    /// фабрика объектов
    TObject* createObject(char type);
    void     killObject  (TObject* object);

    /// регистрирует взаимодействие объектов
    void createInteraction(TObject* one, TObject* two);

    /// поиск взаимодействующих объектов
    void triggerInteractions();

    /// движение объектов
    void move(QPainter& painter);

    /// удаление погибших объектов
    void erase();

    /// обработка зарегистрированных взаимодействий объектов
    void interact();

    /// создание всех необходимых объектов, планируется передавать сюда TMap
    void initObjects();

    /// получить объект, управляемый пользователем
    TObject* getUserObject();

    /// возвращает информацию об объектах на поле
    const char * read();

    /// изменяет состояния объектов в соответствии с полученными данными
    void write(char * data);

private:
    /// the singleton stuff
    Game();
    static Game* _instance;
    Game(Game const&);
    Game& operator=(Game const&);

    list<TObject *> objects;
    list<TObjectInteractor *> interactions;
    QPainter*       _painter;

};


#endif // GAME_H
